package com.geovis.emergency.spd.biz.system.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.geovis.emergency.spd.entity.pc.pojo.vo.SystemDeptVo;
import com.geovis.emergency.spd.entity.system.entity.SystemDept;
import com.geovis.emergency.spd.entity.system.pojo.dto.SystemDeptQueryDTO;
import com.geovis.emergency.spd.entity.system.pojo.vo.SystemDeptTreeVO;
import com.geovis.emergency.spd.entity.system.pojo.vo.SystemUserVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;

import java.util.List;
import java.util.Set;

/**
 * <p>
 * 机构表 服务类
 * </p>
 *
 * @author hhj
 * @since 2021-01-18
 */
public interface ISystemDeptService extends IService<SystemDept> {
    String CACHE_KEY = "system:dept";

    /**
     * 批量删除
     *
     * @param idList 批量删除的id数组
     */
    void removeByIdList(Set<String> idList);


    /**
     * 获取部门树
     * @return
     */
    //@Cacheable(value = CACHE_KEY+":tree")
    List<SystemDeptTreeVO> tree();

//    @Cacheable(value = CACHE_KEY+":tree2",key ="'system:dept:tree2'")
    List<SystemDeptTreeVO> deptTree();

    /**
     * 删除redis缓存
     */
//    @CacheEvict(value =CACHE_KEY+":tree2" ,key ="'system:dept:tree2'",allEntries = true,beforeInvocation=true)
    void deleteTreeCache();

    /**
     * 查询根节点
     * @return
     */
    List<SystemDept> getRootDepts();
    /**
     * 查询部门下的子部门（老方案）
     * @param parentId
     * @return
     */
    List<SystemDept> getChildDepts(String parentId);

    /**
     * 查询部门下的子部门（新方案）
     * @param parentId
     * @return
     */
    List<SystemDeptVo> queryChildDepts(String parentId);

    /**
     * 查询部门下的用户
     * @param deptIds
     * @param excludeUserIds
     * @param keyword
     * @return
     */
    List<SystemUserVo> getUsers(List<String> deptIds,List<String> excludeUserIds,String keyword);

    /**
     * 应急处置app，会议模块，获取某个部门下所有子部门的用户
     * @param parentDeptId
     * @return
     */
    List<SystemUserVo> queryAllChildDeptUsers(String parentDeptId);

    boolean checkLeafNode(String deptId);

    /**
     * 获取部门下的叶子部门的用户
     * @param deptIds
     * @return
     */
    List<String> getLeafDeptUserIds(Set<String> deptIds);


}
